package com.duke.javaagent.bytebuddy.pluggable;


import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.matcher.ElementMatchers;

import java.lang.instrument.Instrumentation;

/**
 * @author gjy
 * @create 2024-11-22 11:28 AM
 */
public class AgentMain {
    private static final String CLASS_NAME = "com.duke.business.service.sb01.demos.utils.StringUtil";
    private static final String SCRIPT_TEST_CLASS_NAME = "com.duke.business.service.sb01.script2platform.scripts.ScriptTestObj";
    /**
     * 静态加载模式
     * premain 方法在目标 JVM 中实际运行 agent 的线程中执行，因此 premain 方法不能修改目标 JVM 的状态。
     *
     * 参数：agentArgs agent参数
     * instrumentation agent运行时的环境
     * @param agentArgs
     * @param inst
     */
    public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("bytebuddy  preMain 执行了...");

        new AgentBuilder.Default()
                //增强 StringUtil 静态类
                //当目标类 第一次加载时，会执行下方.type 方法 去检查。
//                .type(ElementMatchers.named(CLASS_NAME))
//                //当 被type 方法 匹配后，进入 transform 方法
//                .transform(new StaticAgentTransformer())

                //增强 ScriptTestObj 不同的classloader的情况
                .type(ElementMatchers.named("com.duke.business.service.sb01.script2platform.scripts.ScriptTestObj"))
                .transform(new ScriptTestObjTransformer())



                .with(new SWDescriptionStrategy("$erxiao$"))
                .with(new ByteListener())
                .installOn(inst);


        System.out.println("Agent setup complete!");

    }

    /**
     * 动态加载模式
     * agentmain 方法在目标 JVM 中实际运行 agent 的线程中执行，因此 agentmain 方法不能修改目标 JVM 的状态。
     * agentmain方法在 premain 方法之后执行，并且是在目标JVM 中实际运行 agent 的线程中执行，因此 agentmain 方法可以修改目标 JVM 的状态。
     *
     * 参数：agentArgs agent参数
     * instrumentation agent运行时的环境
     * @param agentArgs
     * @param inst
     */
    public static void agentmain(String agentArgs, Instrumentation inst) {
        System.out.println("agentmain 执行了...");
    }




}
